<?xml version = '1.0' encoding = 'UTF-8'?>
<HBRRepo><variables/><rulesets/><rules><rule id="1" name="OQP_BottomUp Allocation" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="seeded">true</property><script type="groovy">		/*PURPOSE: This rule allocates  each account quota, across other dimensions and rolls up account dimension  */        
        def grid=operation.grid;
		String strCrossDim="";
		String strCrossDimAny="";
		int firstDim=0;
		def firstDimMembers = [];
		boolean isUnitsModel=false;
		String driverDimMember;
		boolean isDataModified=false;
		List&lt;String> RowDimensions =[];
		List&lt;String> ColumnDimensions=[];
		List&lt;String> AggDimensions=[];
		List&lt;String> NewColumnDims=[];
		List&lt;String> CustomColumnMbrs=[];
		try
		{
       		/*Evalute if Quota planning model is enabled for units or  Amount */
			Application app=operation.getApplication();
             Cube qtp=operation.getCube(); 
              Dimension dim=app.getDimension(DimensionType.ACCOUNT,qtp);
              if (dim.hasMember("OQP_Units",qtp)==true)
              {
                isUnitsModel=true;
                driverDimMember="OQP_Last Year Units";
              }
              else
              {
                isUnitsModel=false;
                driverDimMember="OQP_Last Year Revenue";                    
              }
              
              /*Fetch member and Dimension Names from Rows of the grid*/
		List&lt;String> fixMemberNames = operation.grid.pov*.essbaseMbrName;
		List&lt;DataGrid.Row> rows = grid.getRows()
		for (DataGrid.Row row : rows) 
		{
			List&lt;DataGrid.HeaderCell> subRows = row.getHeaders();
			for(DataGrid.HeaderCell cell : subRows) 
			  {
				String memName = cell.getDimName();  
			  if (!RowDimensions.contains(memName))
			   {
					RowDimensions.add(memName)             
			   }     	 
			 }        
		}
        /*Fetchs  Members and Dimensions from the column*/

		List&lt;List&lt;DataGrid.HeaderCell>> cols = grid.getColumns();
		for (List&lt;DataGrid.HeaderCell> cells : cols) 
		{
		 
			for (DataGrid.HeaderCell cell : cells)  
			  {
			   String memName = cell.getMbrName();
			   String dimName = cell.getDimName();
			   if (!ColumnDimensions.contains(dimName))
				  {
					if (memName.equals("YearTotal") || memName.equals(driverDimMember)  )
					{
						ColumnDimensions.add(dimName)
					}
					else
					{
					 if(!NewColumnDims.contains(dimName))	
							{
								NewColumnDims.add(dimName)
								strCrossDimAny= strCrossDimAny + "\"No "+ dimName+"\"->"
								strCrossDim = strCrossDim + "\""+ memName+"\"->"
								CustomColumnMbrs.add('''@Relative("'''+memName+'''",0)''')  
								AggDimensions.add('''"'''+dimName+'''"''')
							}
					}
			   	 }   	
			 }				   
		 }		 	 
		StringBuilder cscript = new StringBuilder();
        if(CustomColumnMbrs.size()>0)
        {
        /*if Accounts  or any of the custom dimension is enabled , It gets in to the loop.*/
        /*Start of Main Fix*/
            cscript.append('''SET AGGMISSG ON;\n''')
            cscript.append('''SET UPDATECALC OFF;\n''')
            cscript.append('''FIX(''')
            cscript.append('''"'''+fixMemberNames.join('''","''')+'''"''')
            cscript.append(''',@Relative(Yeartotal,0))\n''')
            cscript.append('''	FIX(''')
            /*Fetchs list of modified rows*/
            for(String dimName:RowDimensions)
            {
                def ls=operation.grid.dataCellIterator{DataCell cell -> cell.edited}.collect([] as Set,{ DataCell cell ->
                cell.getMemberName(dimName)
                })
                if (ls.size()>0)
                    {
                        isDataModified=true;
                    }
                cscript.append('''"'''+ls.join('''","''')+'''"''' )  
                if (firstDim==0)
                {
                    firstDimMembers=ls;
                }
                firstDim++;
            }
            if (CustomColumnMbrs.size()>0)
            {
                cscript.append(''','''+CustomColumnMbrs.join(''','''))
            }
            cscript.append(''')\n''')
			
            def Account=operation.grid.dataCellIterator{DataCell cell -> cell.edited}.collect([] as Set,{ DataCell cell ->
                cell.getAccountName()
                })
			/* Allocates numbers to other dimensions based on existing mix or last year mix*/
            cscript.append('''		"'''+Account[0]+'''"(\n''');
            cscript.append('''			IF (('''+strCrossDim+'''"OQP_Quota"!=#MISSING) AND ('''+strCrossDim+'''"OQP_Quota"!=0) )\n''')
            cscript.append('''				"'''+Account[0]+'''"=''')
            cscript.append(strCrossDimAny +'''"'''+Account[0]+'''"->"Yeartotal"*''')
            cscript.append('''("OQP_Quota"/''')
            cscript.append(strCrossDim+'''"OQP_Quota"->"Yeartotal");\n''')
            cscript.append('''				ELSE\n''')
            cscript.append('''				"'''+Account[0]+'''"=''')
            cscript.append(strCrossDimAny +'''"'''+Account[0]+'''"->"Yeartotal"*''')
            cscript.append('''("'''+driverDimMember+'''"/''')
            cscript.append(strCrossDim +'''"'''+driverDimMember+'''"->"Yeartotal");\n''')
            cscript.append('''			ENDIF\n''')
            cscript.append('''			);\n''')
            cscript.append('''	ENDFIX\n''')
            /*Aggregates custom dimensions*/
            if (NewColumnDims.size()>0)
            {

                cscript.append('''	FIX("'''+firstDimMembers.join('''","''')+'''","'''+Account[0]+'''")\n''')
                cscript.append('''		AGG(''')
                cscript.append(AggDimensions.join(''','''))
            if (RowDimensions.size()==2)
            {
                cscript.append(''',"'''+RowDimensions[1]+'''"''')
            }
             cscript.append(''');\n ''')
                cscript.append('''	ENDFIX\n''')
            }
            cscript.append('''ENDFIX\n''')
            if (isDataModified==true) 
            {
                println (cscript.toString())
                return cscript.toString();
            }
        }
		}catch(all) {
				throw new HspRuntimeException('Error occured while executing business rule');
			}		
		
		</script></rule></rules><components/><deployobjects><deployobject product="2" application="salespln" plantype="oep_qtp" obj_id="1" obj_type="1" name="OQP_BOTTOMUP ALLOCATION"/></deployobjects></HBRRepo>